package com.qcu.tools;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qcu.entity.AiAppoint;
import com.qcu.entity.Appointment;
import com.qcu.entity.ExaminationInfo;
import com.qcu.service.AiAppointService;
import com.qcu.service.AppointmentService;
import com.qcu.service.ExaminationInfoService;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @Name: MyComputer
 * @ClassName AppointmentTool
 * @Description:
 * @date 2025/4/24 19:17
 */
@Component
public class AppointmentTool {

    @Autowired
    private AiAppointService appointmentService;

    @Resource
    private ExaminationInfoService examinationInfoService;

    @Tool(name = "预约挂号", value = "根据参数，先执行工具方法queryDepartment查询是否可预约，并直 接给用户回答是否可预约，并让用户确认所有预约信息，用户确认后再进行预约。如果用户没有提供具体的医生姓名，请从\n" +
            "向量存储中找到一位医生。")
    public String bookAppointment(AiAppoint appointment) {
        //查找数据库中是否包含对应的预约记录
        AiAppoint appointmentDB = appointmentService.getOne(appointment);
        if (appointmentDB == null) {
            appointment.setId(null);//防止大模型幻觉设置了id
            if (appointmentService.save(appointment)) {
                return "预约成功，并返回预约详情";
            } else {
                return "预约失败";
            }
        }
        return "您在相同的科室和时间已有预约";
    }

    @Tool(name = "取消预约挂号", value = "直接返回：不想去就不去了，不用取消。")
    public String cancelAppointment(AiAppoint appointment) {
//        Appointment appointmentDB = appointmentService.getOne(appointment);
//        if(appointmentDB != null){
//            //删除预约记录
//            if(appointmentService.removeById(appointmentDB.getId())){
//                return "取消预约成功";
//            }else{
//                return "取消预约失败";
//            }
//        }
        //取消失败
        return "不想去就不用去，不用取消。";
    }

    @Tool(name = "查询是否有号源", value="根据科室名称，日期，时间和医生查询是否有号源，并返回给用 户")
            public boolean queryDepartment(
            @P(value = "科室名称") String name,
            @P(value = "日期") String date,
            @P(value = "医生名称", required = false) String doctorName
    ) {
        System.out.println("查询是否有号源");
        System.out.println("科室名称：" + name);
        System.out.println("日期：" + date);
        System.out.println("医生名称：" + doctorName);
//TODO 维护医生的排班信息：
//如果没有指定医生名字，则根据其他条件查询是否有可以预约的医生（有返回true，否则返回false）；
//如果指定了医生名字，则判断医生是否有排班（没有排版返回false）
//如果有排班，则判断医生排班时间段是否已约满（约满返回false，有空闲时间返回true）
        return true;
    }

    @Tool(name = "查询体检信息", value = "根据身份证信息查询体检信息，如果有记录则将记录以友好的形式反馈给用户并分析记录给出建议，如果没有记录表则友好的表示没找到")
    public String queryExamination(@P(value = "身份证") String id) {
        ExaminationInfo info = examinationInfoService.getById(id);
        if (info != null){
            return info.getContent();
        }
        return "没有找到该用户的体检信息";
    }
}
